package co.id.btel.create.pdf;

import java.io.FileOutputStream;
import java.util.Date;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class PdfSample {

	private static String FILE = "E:/BTE/samplePdf/Image.pdf";
	private static String IMG = "F:/app_3/workspace/BTEService/data/Polos1.jpg";
	private static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18,
			Font.BOLD);
	private static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12,
			Font.NORMAL, BaseColor.RED);
	private static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16,
			Font.BOLD);
	private static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12,
			Font.BOLD);
	/** Owner user. */
	public static byte[] USER = "bakrie".getBytes();
	/** Owner password. */
	public static byte[] OWNER = "2197999336".getBytes();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			Document document = new Document();
			PdfWriter.getInstance(document, new FileOutputStream(FILE));

			Image img = Image.getInstance(IMG);
			img.scaleToFit(PageSize.LEGAL.getHeight()*1.38f,
					PageSize.LEGAL.getWidth()*1.38f);
			img.setAbsolutePosition(0, 0);

			document.open();
			document.add(img);
			PdfCustomer.addCustomer(document);
			addMetaData(document);
			// addTitlePage(document);
			//addContent(document);
			// addRectangle(writer);
			document.close();
			System.out.print("done!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// iText allows to add metadata to the PDF which can be viewed in your Adobe
	// Reader
	// under File -> Properties
	private static void addRectangle(PdfWriter writer) {
		PdfContentByte canvas = writer.getDirectContent();
		// state 1:
		canvas.setRGBColorFill(0x00, 0x00, 0x00);
		// fill a rectangle in state 1
		canvas.rectangle(10, 10, 60, 60);
		canvas.fill();
		canvas.saveState();

		// state 2;
		canvas.setLineWidth(3);
		canvas.setRGBColorFill(0x8B, 0x00, 0x00);
		// fill and stroke a rectangle in state 2
		canvas.rectangle(40, 20, 60, 60);
		canvas.fillStroke();
		canvas.saveState();

		// state 3:
		canvas.concatCTM(1, 0, 0.1f, 1, 0, 0);
		canvas.setRGBColorStroke(0xFF, 0x45, 0x00);
		canvas.setRGBColorFill(0xFF, 0xD7, 0x00);
		// fill and stroke a rectangle in state 3
		canvas.rectangle(70, 30, 60, 60);
		canvas.fillStroke();
		canvas.restoreState();

		// stroke a rectangle in state 2
		canvas.rectangle(100, 40, 60, 60);
		canvas.stroke();
		canvas.restoreState();

		// fill and stroke a rectangle in state 1
		canvas.rectangle(130, 50, 60, 60);
		canvas.fillStroke();
	}

	public static void addMetaData(Document document) {
		document.addTitle("Bakrie Telecom Bill Postpaid");
		document.addSubject("Billing Monthly Customer");
		document.addKeywords("Bill, Esia, AHA, PDF, Bakrie");
		document.addAuthor("Kurnia Yusup");
		document.addCreator("Kurnia Yusup");
		document.setPageSize(PageSize.LEGAL);
	}

	private static void addTitlePage(Document document)
			throws DocumentException {
		Paragraph preface = new Paragraph();
		// We add one empty line
		addEmptyLine(preface, 1);
		// Lets write a big header
		preface.add(new Paragraph("Title of the document", catFont));

		addEmptyLine(preface, 1);
		// Will create: Report generated by: _name, _date
		preface.add(new Paragraph(
				"Report generated by: " + System.getProperty("user.name") + ", " + new Date(), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				smallBold));
		addEmptyLine(preface, 3);
		preface.add(new Paragraph(
				"This document describes something which is very important ",
				smallBold));

		addEmptyLine(preface, 8);

		preface.add(new Paragraph(
				"This document is a preliminary version and not subject to your license agreement or any other agreement with vogella.de ;-).",
				redFont));

		document.add(preface);
		// Start a new page
		document.newPage();
	}

	private static void addContent(Document document) throws DocumentException {
		Anchor anchor = new Anchor("First Chapter", catFont);
		anchor.setName("First Chapter");

		// Second parameter is the number of the chapter
		Chapter catPart = new Chapter(new Paragraph(anchor), 1);

		Paragraph subPara = new Paragraph("Subcategory 1", subFont);
		Section subCatPart = catPart.addSection(subPara);
		subCatPart.add(new Paragraph("Hello"));

		subPara = new Paragraph("Subcategory 2", subFont);
		subCatPart = catPart.addSection(subPara);
		subCatPart.add(new Paragraph("Paragraph 1"));
		subCatPart.add(new Paragraph("Paragraph 2"));
		subCatPart.add(new Paragraph("Paragraph 3"));

		// Add a list
		createList(subCatPart);
		Paragraph paragraph = new Paragraph();
		addEmptyLine(paragraph, 5);
		subCatPart.add(paragraph);

		// Add a table
		createTable(subCatPart);

		// Now add all this to the document
		document.add(catPart);

		// Next section
		anchor = new Anchor("Second Chapter", catFont);
		anchor.setName("Second Chapter");

		// Second parameter is the number of the chapter
		catPart = new Chapter(new Paragraph(anchor), 1);

		subPara = new Paragraph("Subcategory", subFont);
		subCatPart = catPart.addSection(subPara);
		subCatPart.add(new Paragraph("This is a very important message"));

		// Now add all this to the document
		document.add(catPart);

	}

	private static void createTable(Section subCatPart)
			throws BadElementException {
		PdfPTable table = new PdfPTable(3);

		// t.setBorderColor(BaseColor.GRAY);
		// t.setPadding(4);
		// t.setSpacing(4);
		// t.setBorderWidth(1);

		PdfPCell c1 = new PdfPCell(new Phrase("Table Header 1"));
		c1.setHorizontalAlignment(Element.ALIGN_CENTER);
		table.addCell(c1);

		c1 = new PdfPCell(new Phrase("Table Header 2"));
		c1.setHorizontalAlignment(Element.ALIGN_CENTER);
		table.addCell(c1);

		c1 = new PdfPCell(new Phrase("Table Header 3"));
		c1.setHorizontalAlignment(Element.ALIGN_CENTER);
		table.addCell(c1);
		table.setHeaderRows(1);

		table.addCell("1.0");
		table.addCell("1.1");
		table.addCell("1.2");
		table.addCell("2.1");
		table.addCell("2.2");
		table.addCell("2.3");

		subCatPart.add(table);

	}

	private static void createList(Section subCatPart) {
		List list = new List(true, false, 10);
		list.add(new ListItem("First point"));
		list.add(new ListItem("Second point"));
		list.add(new ListItem("Third point"));
		subCatPart.add(list);
	}

	private static void addEmptyLine(Paragraph paragraph, int number) {
		for (int i = 0; i < number; i++) {
			paragraph.add(new Paragraph(" "));
		}
	}

}
